#include "MyIIC.h"

//void I2C_SDA_OUT(void)
//	{
//    __RCC_GPIOB_CLK_ENABLE();

//    GPIO_InitTypeDef GPIO_InitStruct;
//    GPIO_InitStruct.IT=GPIO_IT_NONE;
//    GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;      //开漏输出
//    GPIO_InitStruct.Pins=GPIO_PIN_11;
//    GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
//    GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
//}
//void I2C_SDA_IN(void)
//	{
//    __RCC_GPIOB_CLK_ENABLE();

//    GPIO_InitTypeDef GPIO_InitStruct;
//    GPIO_InitStruct.IT=GPIO_IT_NONE;
//    GPIO_InitStruct.Mode=GPIO_MODE_INPUT;      //开漏输出
//    GPIO_InitStruct.Pins=GPIO_PIN_11;
//    GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
//    GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
//}
void I2C_GPIO_Init(void)   //GY-33颜色识别模块GPIO初始化
{
    __RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.IT=GPIO_IT_NONE;
    GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_OD;      //开漏输出
    GPIO_InitStruct.Pins=GPIO_PIN_10|GPIO_PIN_11;
    GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
    GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
    SCL(1);
    SDA(1);
}

void I2C_Delay(void) //I2C延时函数
{
    delay_us(time);
}

uint8_t I2C_Start(void)  //发送起始信号
{
    SDA(1);
    SCL(1);
    I2C_Delay();

    if(ReadSDA==0)  return 0;
    SDA(0);
    I2C_Delay();
    if(ReadSDA==1) return 0;
    SCL(0);
    I2C_Delay();

    return 1;
}

void I2C_Stop(void)  //发送停止信号
{
    SDA(0);
    SCL(0);
    I2C_Delay();
    SCL(1);
    I2C_Delay();
    SDA(1);
}

void I2C_SendACK(uint8_t ackbit)  //发送应答
{
    SDA(ackbit);
    SCL(1);
    I2C_Delay();
    SCL(0);
    I2C_Delay();
	  SDA(1);
}

void I2C_SendByte(uint8_t Byte)  //发送1字节（8-bit）的数据
{
    uint8_t i;
    SCL(0);
    for (i = 0; i < 8; i++)
    {
        if(Byte&0x80) SDA(1);
        else SDA(0);
        SCL(1);
        I2C_Delay();
        SCL(0);
        Byte<<=1;
        I2C_Delay();
    }
}

uint8_t I2C_ReceiveByte(void)  //接收1字节（8-bit）的数据
{
    uint8_t data,i;
//    SDA(0);
    delay_us(5);
//		I2C_SDA_IN();
    for(i=0; i<8; i++)
    {
        SCL(1);
        data<<=1;
        if(ReadSDA==1)data|=0x01;
        I2C_Delay();
        SCL(0);
        I2C_Delay();
    }

    return data;
}

uint8_t I2C_WaitAck(void) //等待应答
{
//    uint16_t i;

    SDA(1);
    SCL(1);

//    while(ReadSDA)
//    {	
//    }

//    if(ReadSDA==1)
//    {
//        SCL(0);
//        return 0;
//    }
    I2C_Delay();
    SCL(0);
    I2C_Delay();

    return 1;
}

uint8_t WriteData(uint8_t Slave_Addr,uint8_t REG_Addr,uint8_t data)  //写操作
{
    if(I2C_Start()==0) RETURN

        I2C_SendByte(Slave_Addr);
    if(I2C_WaitAck()==0) RETURN

        I2C_SendByte(REG_Addr);
    if(I2C_WaitAck()==0) RETURN

        I2C_SendByte(data);
    if(I2C_WaitAck()==0) RETURN

        I2C_Stop();										//发送停止信号

    return 1;
}

uint8_t ReadData(uint8_t Slave_Addr,uint8_t REG_Addr,uint8_t *data,uint8_t length) //读操作
{
    if(I2C_Start()==0) RETURN

        I2C_SendByte(Slave_Addr);
    if(I2C_WaitAck()==0) RETURN

        I2C_SendByte(REG_Addr);
    if(I2C_WaitAck()==0) RETURN

        if(I2C_Start()==0) RETURN

            I2C_SendByte(Slave_Addr+1);
    if(I2C_WaitAck()==0) RETURN

        while(--length)
        {
            *data++=I2C_ReceiveByte();
            I2C_SendACK(0);
            delay_ms(110);
        }
    *data=I2C_ReceiveByte();
    I2C_SendACK(1);
    I2C_Stop();										//发送停止信号

    return 1;
}
